package com.kaikeba.service.impl;

import com.kaikeba.bean.Express;
import com.kaikeba.dao.ExpressDao;
import com.kaikeba.dao.impl.ExpressDaoImpl;
import com.kaikeba.exception.CodeException;
import com.kaikeba.service.ExpressService;
import com.kaikeba.util.RandomUtil;
import java.util.List;
import java.util.Map;


public class ExpressServiceImpl implements ExpressService {

    private ExpressDao dao = new ExpressDaoImpl();

    /**
     * 用户返回控制台中所需的数据
     * [{总数：xxx，今日新增：xxx}，{待取总数：xxx，待取今日新增数：xxx}]
     *
     * @return
     */
    @Override
    public List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 查找全部快递并根据参数判断是否分页
     *
     * @param limit      是否分页 true（默认）分页  false 不分页
     * @param offset     起始索引
     * @param pageNumber 单页显示数量
     * @return
     */
    @Override
    public List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit,offset,pageNumber);
    }

    /**
     * 根据单号查询快递信息
     *
     * @param number 快递单号
     * @return
     */
    @Override
    public Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据取件码查询快递信息
     * @param code 取件码
     * @return
     */
    @Override
    public Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据用户电话号码查询快递信息
     *
     * @param userPhone 用户电话号码
     * @return
     */
    @Override
    public List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    /**
     * 根据用户电话号码和状态查询对应状态的快递信息（取件或待取）
     *
     * @param userPhone 用户电话号码
     * @param status    快递状态码
     * @return
     */
    @Override
    public List<Express> findByUserPhoneAndStatus(String userPhone, int status) {
        return dao.findByUserPhoneAndStatus(userPhone,status);
    }

    /**
     * 根据录入人的手机号，查询快递单号
     *
     * @param sysPhone 录入人手机号
     * @return
     */
    @Override
    public List<Express> findAllBySysPhone(String sysPhone) {
        return dao.findAllBySysPhone(sysPhone);
    }

    /**
     * 快递录入
     * @param e 录入的快递对象
     * @return 录入的结果，true表示成功，false表示失败
     */
    @Override
    public boolean insert(Express e) {
        e.setCode(RandomUtil.get());
        try {
            return dao.insert(e);
        } catch (CodeException ex) {
            return insert(e);
        }
    }

    /**
     * 快递的修改
     *
     * @param id         要修改的快递id
     * @param newExpress 新的快递对象（number，company,username,status）
     * @return 修改的结果，true表示成功，false表示失败
     */
    @Override
    public boolean update(int id, Express newExpress) {
        if (newExpress.getUserPhone()!=null){
            //有电话值，删除再重新添加
            boolean delete = dao.delete(id);
            if (delete){
                return insert(newExpress);
            }
                return false;
        }else {
            boolean update = dao.update(id, newExpress);
            //更新后如果新值要求更为已取件，则要把状态更为已取件状态（设置取出时间，并设置取件码为空）
            Express e = dao.findByNumber(newExpress.getNumber());
            if (newExpress.getStatus()==1){
                boolean b = dao.updateStatus(e.getCode());
            }
            return update;
        }
    }

    /**
     * 快递删除
     *
     * @param id 需要删除的快递id
     * @return
     */
    @Override
    public boolean delete(int id) {
        return dao.delete(id);
    }

    /**
     * 更改快递的状态为1，设置取出时间，并设置取件码为空，表示取件完成
     *
     * @param code 要修改的快递取件码
     * @return 修改的结果，true表示成功，false表示失败
     */
    @Override
    public boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }
}
